package ai.esc.speedy.admin.user.infrastructure.oauth2;

/**
 * AS
 * <p>
 * 授权服务器，它认证RO的身份，为RO提供授权审批流程，并最终颁发授权令牌(Access Token)。
 *
 * @author Rubin
 * @version v1 2020/2/27 14:17
 */
public interface AuthorizeService {

    /**
     * 认证资源所有者身份
     *
     * @return
     */
    boolean certifiedResourceOwner();

    /**
     * AS提供授权审批界面
     */
    void authorizationApprovalInterface();

    /**
     * Client拿authorization_code去访问AS以交换所需的access_token。
     * <p>
     * AS在收到authorization_code时需要验证Client的身份，
     * 并验证收到的redirect_uri与第3步请求authorization_code时所使用的redirect_uri相匹配。
     * 如果验证通过，AS将返回access_token，以及refresh_token（若access_type=offline）。
     *
     * @param codeRequest
     * @return
     */
    String[] getAccessToken(CodeRequest codeRequest);

    /**
     * access_type=offline时，将允许Client直接持refresh_token来换取一个新的access_token。
     *
     * @param refreshToken
     * @return
     */
    String getAccessToken(String refreshToken);


    /**
     * 根据客户端id 查询客户端是否存在
     */
    boolean checkClientId(String clientId);

    /**
     * 添加 auth code
     */
    void addAuthCode(String authCode, String username);

    /**
     * 检查客户端安全Key是否正确
     */
    boolean checkClientSecret(String clientSecret);

    /**
     * 检查authCode是否可用
     */
    boolean checkAuthCode(String authCode);

    /**
     * 根据 authCode 获取用户名
     */
    String getUsernameByAuthCode(String authCode);

    /**
     * 添加accessToken
     */
    void addAccessToken(String accessToken, String username);

    /**
     * access token 过期时间
     */
    long getExpireIn();

    /**
     * 检查 accessToken 是否可用
     */
    boolean checkAccessToken(String accessToken);

    /**
     * 根据 accessToken 获取用户名
     */
    String getUsernameByAccessToken(String accessToken);
}
